#include "AlgoEvaluatorModuleFactory.h"
#include "AlgoEvaluatorModule0Topography.h"
#include "AlgoEvaluatorModule1EnvirNoise.h"
#include "AlgoEvaluatorModule2Turbulence.h"
#include "AlgoEvaluatorModule3CPCD.h"
#include "AlgoEvaluatorModule4AcousticStealth.h"
#include "AlgoEvaluatorModule5SensorStealth.h"
#include "AlgoEvaluatorModule6NavigationDistance.h"
#include "AlgoEvaluatorModule7NavigationTime.h"
#include "AlgoEvaluatorModule8NavigationEnergy.h"
#include "AlgoEvaluatorModule9EndPointCompletion.h"
#include "AlgoEvaluatorModule10TimeCompletion.h"
#include "AlgoEvaluatorModule11MandatoryAreaCompletion.h"
#include "AlgoEvaluatorModule12HardRestriction.h"
#include "AlgoEvaluatorModule13Motivation.h"
#include "AlgoEvaluatorModule14DangerousAreaExposure.h"

class algo::AlgoEvaluatorModuleFactoryPrivate
{
public:
};

algo::AlgoEvaluatorModuleFactory::AlgoEvaluatorModuleFactory()
	: d(new algo::AlgoEvaluatorModuleFactoryPrivate())
{
}

algo::AlgoEvaluatorModuleFactory::~AlgoEvaluatorModuleFactory()
{
	delete d;
}

algo::AlgoEvaluatorModuleFactory* algo::AlgoEvaluatorModuleFactory::Single()
{
	static AlgoEvaluatorModuleFactory AEMF;
	return &AEMF;
}

std::shared_ptr<algo::AlgoEvaluatorModuleBase> algo::AlgoEvaluatorModuleFactory::create(algobase::EvaluateL2IndexType type)
{
	switch (type)
	{
		case algobase::EL2IT_0Topography:
		{
			return std::make_shared<algo::AlgoEvaluatorModule0Topography>();
		}
		case algobase::EL2IT_1EnvironmentalNoise:
		{
			return std::make_shared<algo::AlgoEvaluatorModule1EnvirNoise>();
		}
		case algobase::EL2IT_2Turbulence:
		{
			return std::make_shared<algo::AlgoEvaluatorModule2Turbulence>();
		}
		case algobase::EL2IT_3CPCD:
		{
			return std::make_shared<algo::AlgoEvaluatorModule3CPCD>();
		}
		case algobase::EL2IT_4AcousticStealth:
		{
			return std::make_shared<algo::AlgoEvaluatorModule4AcousticStealth>();
		}
		case algobase::EL2IT_5SensorStealth:
		{
			return std::make_shared<algo::AlgoEvaluatorModule5SensorStealth>();
		}
		case algobase::EL2IT_6NavigationDistance:
		{
			return std::make_shared<algo::AlgoEvaluatorModule6NavigationDistance>();
		}
		case algobase::EL2IT_7NavigationTime:
		{
			return std::make_shared<algo::AlgoEvaluatorModule7NavigationTime>();
		}
		case algobase::EL2IT_8NavigationEnergy:
		{
			return std::make_shared<algo::AlgoEvaluatorModule8NavigationEnergy>();
		}
		case algobase::EL2IT_9EndPointCompletion:
		{
			return std::make_shared<algo::AlgoEvaluatorModule9EndPointCompletion>();
		}
		case algobase::EL2IT_10TimeCompletion:
		{
			return std::make_shared<algo::AlgoEvaluatorModule10TimeCompletion>();
		}
		case algobase::EL2IT_11MandatoryAreaCompletion:
		{
			return std::make_shared<algo::AlgoEvaluatorModule11MandatoryAreaCompletion>();
		}
		case algobase::EL2IT_12HardRestriction:
		{
			return std::make_shared<algo::AlgoEvaluatorModule12HardRestriction>();
		}
		case algobase::EL2IT_13Motivation:
		{
			return std::make_shared<algo::AlgoEvaluatorModule13Motivation>();
		}
		case algobase::EL2IT_14DangerousAreaExposure:
		{
			return std::make_shared<algo::AlgoEvaluatorModule14DangerousAreaExposure>();
		}

		case algobase::EL2IT_Count:
		default:
		{
			break;
		}
	}

	return nullptr;
}
